package com.ltedu.sms.utils;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class SendSmsUtils implements InitializingBean {

    private static Logger logger = LoggerFactory.getLogger(SendSmsUtils.class);

    @Value("${accessKeyId}")
    private String accessKeyId;
    @Value("${secret}")
    private String secret;
    @Value("${signName}")
    private String signName;
    @Value("${templateCode}")
    private String templateCode;

    public static String AccessKey_ID;
    public static String AccessKey_Secret;
    public static String SignName;
    public static String TemplateCode;
    private static IAcsClient client = null;

    @Override
    public void afterPropertiesSet() throws Exception {
        AccessKey_ID = accessKeyId;
        AccessKey_Secret = secret;
        SignName = signName;
        TemplateCode = templateCode;
        // 设置公共请求参数，初始化Client。
        DefaultProfile profile = DefaultProfile.getProfile(
                // API支持的地域ID，如短信API的值为：cn-hangzhou。
                "cn-hangzhou",
                // 您的AccessKey ID。
                AccessKey_ID,
                // 您的AccessKey Secret。
                AccessKey_Secret
        );
        logger.info("SendSmsUtils.init...AccessKey_ID:{}", AccessKey_ID);
        logger.info("SendSmsUtils.init...AccessKey_Secret:{}", AccessKey_Secret);
        client = new DefaultAcsClient(profile);
    }



    /**
     * 添加短信模板
     *
     * @param TemplateType    短信类型。0：验证码；1：短信通知；2：推广短信；3：国际/港澳台消息
     * @param TemplateName    模板名称，长度为1~30个字符
     * @param TemplateContent 模板内容，长度为1~500个字符
     * @param remark          短信模板申请说明
     * @return {@link String}
     * @throws ClientException 客户端异常
     */
    public static String addSmsTemplate(String TemplateType,
                                        String TemplateName,
                                        String TemplateContent,
                                        String remark) {
        try {
            CommonRequest addSmsTemplateRequest = new CommonRequest();
            addSmsTemplateRequest.setSysDomain("dysmsapi.aliyuncs.com");
            addSmsTemplateRequest.setSysAction("AddSmsTemplate");
            addSmsTemplateRequest.setSysVersion("2017-05-25");
            // 短信类型。0：验证码；1：短信通知；2：推广短信；3：国际/港澳台消息
            addSmsTemplateRequest.putQueryParameter("TemplateType", TemplateType);
            // 模板名称，长度为1~30个字符
            addSmsTemplateRequest.putQueryParameter("TemplateName", TemplateName);
            // 模板内容，长度为1~500个字符
            addSmsTemplateRequest.putQueryParameter("TemplateContent", TemplateContent);
            // 短信模板申请说明
            addSmsTemplateRequest.putQueryParameter("Remark", remark);
            CommonResponse addSmsTemplateResponse = client.getCommonResponse(addSmsTemplateRequest);
            String data = addSmsTemplateResponse.getData();
            // 消除返回文本中的反转义字符
            String sData = data.replaceAll("'\'", "");
            logger.info("SendSmsUtils.addSmsTemplate...{}", sData);
            Gson gson = new Gson();
            // 将字符串转换为Map类型，取TemplateCode字段值
            Map map = gson.fromJson(sData, Map.class);
            Object templateCode = map.get("TemplateCode");
            return templateCode.toString();
        } catch (ClientException e) {
            e.printStackTrace();
        } catch (JsonSyntaxException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 发送短信
     *
     * @param phone        电话
     * @param templateCode 模板代码
     * @param param        参数
     * @return boolean
     */
    public static boolean sendSms(String phone, String templateCode, Map<String, Object> param) {
        try {
            logger.info("SendSmsUtils.sendSms...");
            CommonRequest request = new CommonRequest();
            request.setSysDomain("dysmsapi.aliyuncs.com");
            request.setSysVersion("2017-05-25");
            request.setSysAction("SendSms");
            // 接收短信的手机号码
            request.putQueryParameter("PhoneNumbers", phone);
            // 短信签名名称。请在控制台签名管理页面签名名称一列查看（必须是已添加、并通过审核的短信签名）。
            request.putQueryParameter("SignName", SignName);
            logger.info("SendSmsUtils.sendSms...SignName:{}", SignName);
            // 短信模板ID
            request.putQueryParameter("TemplateCode", templateCode);
            // 短信模板变量对应的实际值，JSON格式。
            request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));
            CommonResponse commonResponse = client.getCommonResponse(request);
            logger.info("SendSmsUtils.sendSms...response:{}", commonResponse.getData());
            return commonResponse.getHttpResponse().isSuccess();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }

}